package cbm.seguridad.controller;

import java.sql.SQLException;
import java.util.Date;
import java.util.List;

import javax.naming.Context;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.ModelAndView;

import cbm.commons.BaseController;
import cbm.commons.ConstantsWeb;
import cbm.commons.ResultadoOperacionBean;
import cbm.commons.SessionContainer;
import ejb.cbm.commons.CadenaUtil;
import ejb.cbm.commons.FormatoFecha;
import ejb.cbm.commons.StackTrace2String;
import ejb.cbm.seguridad.bean.OpcionBean;
import ejb.cbm.seguridad.bean.PerfilBean;
import ejb.cbm.seguridad.bean.RegistroIngresoBean;
import ejb.cbm.seguridad.bean.UsuarioBean;
import ejb.cbm.seguridad.local.PerfilFacadeLocal;
import ejb.cbm.seguridad.local.RegistroIngresoFacadeLocal;
import ejb.cbm.seguridad.local.UsuarioFacadeLocal;

public class LoginLogoutController extends BaseController{
	@Autowired	
	private RegistroIngresoFacadeLocal registroIngresoFacadeLocal;
	@Autowired
	private PerfilFacadeLocal perfilFacadeLocal;
	@Autowired
	private UsuarioFacadeLocal usuarioFacadeLocal;
	
	public void setRegistroIngresoFacadeLocal(RegistroIngresoFacadeLocal registroIngresoFacadeLocal) {
		this.registroIngresoFacadeLocal = registroIngresoFacadeLocal;
	}
	public void setPerfilFacadeLocal(PerfilFacadeLocal perfilFacadeLocal) {
		this.perfilFacadeLocal = perfilFacadeLocal;
	}
	public void setUsuarioFacadeLocal(UsuarioFacadeLocal usuarioFacadeLocal) {
		this.usuarioFacadeLocal = usuarioFacadeLocal;
	}
	
	public ModelAndView open(HttpServletRequest request, HttpServletResponse response){
		String paginaSig = resources.getString("pagina_login");
		return new ModelAndView(request.getContextPath()+"/"+paginaSig);
	}

	public ModelAndView login(HttpServletRequest request, HttpServletResponse response){
		HttpSession session = request.getSession(false);
		String codigoUsuario = request.getParameter("txtUsuario").toUpperCase();
		String usuldap = codigoUsuario;//MAV
		UsuarioBean usuarioLDAP = null;
		UsuarioBean usuarioLocal = null;
		String paginaSig = request.getContextPath();
		String pagAjaxRequest = resources.getString("ajaxrequest");
		SessionContainer sessionContainer = new SessionContainer();
		ResultadoOperacionBean resultado = new ResultadoOperacionBean(ConstantsWeb.EXITO);
		RegistroIngresoBean ingreso = null;
		Context context = null;
		String fecha = null;
		List<OpcionBean> listMenu = null;
		String menuOpciones = null;
		PerfilBean perfil = null;

		if (session == null) {
			session = request.getSession(true);
		}
		
		try {
			//ServiciosSeguridadBbva servicios = new ServiciosSeguridadBbva(request);
			//servicios.obtener_ID();
			//usuldap = servicios.getUsuario().toUpperCase();
			
			if(usuldap != null && codigoUsuario == usuldap){
				
				usuarioLDAP = new UsuarioBean();
				/*usuarioLDAP.setCodigousuario(usuldap);
				usuarioLDAP.setNombre(IILDPeUsuario.recuperarUsuario(usuldap).getNombre());
				usuarioLDAP.setApellidopaterno(IILDPeUsuario.recuperarUsuario(usuldap).getApellido1());
				usuarioLDAP.setApellidomaterno(IILDPeUsuario.recuperarUsuario(usuldap).getApellido2());
				usuarioLDAP.setCodigooficina((IILDPeUsuario.recuperarUsuario(usuldap).getBancoOficina().getCodigo()));
				usuarioLDAP.setCorreoelectronico(IILDPeUsuario.recuperarUsuario(usuldap).getEmail());
				usuarioLDAP.setFlagactivo(new Long(1));
				usuarioLDAP.setFlagldap(new Long(1));
				usuarioLDAP.setCodigoPuesto(IILDPeUsuario.recuperarUsuario(usuldap).getCargo().getCodigo());*/
				
				//Se obtiene la informacion del usuario logeado del sistema local
				usuarioLocal = usuarioFacadeLocal.buscar(codigoUsuario);
				
				fecha = FormatoFecha.dateUtilToStringYYYYMMDD(new Date());
				//Se valida si el usuario ya ha ingresado sus datos de oficina y terminal
				ingreso = registroIngresoFacadeLocal.ultimoRegistroIngreso(codigoUsuario, fecha);
				
				//Se obtiene el perfil de usuario
				perfil = perfilFacadeLocal.obtienePerfilByCodigoUsuario(codigoUsuario);
				
				if(ingreso != null){
					paginaSig = paginaSig + resources.getString("pagina_principal");
					//Se arma las opciones de menu
					listMenu = perfilFacadeLocal.obtenerOpcionesMenuUsuario(codigoUsuario);
					menuOpciones = this.armaMenuUsuario(listMenu);
					sessionContainer.addSessionElement(ConstantsWeb.MENU, menuOpciones);
					
				}else{
					paginaSig = paginaSig + resources.getString("datos_ingreso_login");
					ingreso = new RegistroIngresoBean();
					ingreso.setCodigousuario(usuarioLocal.getCodigousuario());
					ingreso.setFecha(FormatoFecha.dateUtilToStringDDMMYYYY(new Date()));
					ingreso.setCodigooficina(usuarioLocal.getCodigooficina());
				}
				
				ingreso.setUsuarioBean(usuarioLocal);
				ingreso.getUsuarioBean().setCodigousuario(usuarioLocal.getCodigousuario());
				ingreso.getUsuarioBean().setCodigoPuesto(usuarioLocal.getCodigoPuesto());
				
				ingreso.getUsuarioBean().setPerfilBean(perfil);	
				
				sessionContainer.addSessionElement(ConstantsWeb.REGISTRO_INGRESO, ingreso);
				sessionContainer.addSessionElement(ConstantsWeb.USUARIO, usuarioLocal);

			}else{
				paginaSig = paginaSig + resources.getString("pagina_login");
				resultado.setResultado(ConstantsWeb.ERROR);
				resultado.setTitulo("Usuario invalido");
				resultado.setMensaje("El usuario ingresado no se encuentra logeado en el LDAP");
			}

		} catch (RuntimeException e) {
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error");
			resultado.setMensaje("RuntimeException");
			//resultado.setTrace(StackTrace2String.stackTraceToString(e));
			paginaSig = paginaSig + resources.getString("pagina_login");
			e.printStackTrace();
		} catch (SQLException e) {
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error");
			resultado.setMensaje("SQLException");
			//resultado.setTrace(StackTrace2String.stackTraceToString(e));
			paginaSig = paginaSig + resources.getString("pagina_login");
			e.printStackTrace();
		}catch (Exception e) {
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error");
			resultado.setMensaje("Exception");
			//resultado.setTrace(StackTrace2String.stackTraceToString(e));
			paginaSig = paginaSig + resources.getString("pagina_login");
			e.printStackTrace();
		}
		
		resultado.setPagSig(paginaSig);
		sessionContainer.addTemporal(ConstantsWeb.RESULTADO_OPERACION, resultado);
		session.setAttribute(ConstantsWeb.SESSION_CONTAINER, sessionContainer);
		
		return new ModelAndView(pagAjaxRequest,"responseText",resultado.getAsArrayJS());
	}

	public ModelAndView logout(HttpServletRequest request, HttpServletResponse response){
		String paginaSig = resources.getString("pagina_login");
		HttpSession session = request.getSession(false);
		session.invalidate();
		return new ModelAndView(paginaSig);
	}

	public ModelAndView registroIngreso(HttpServletRequest request, HttpServletResponse response){
		
		HttpSession session = request.getSession(false);
		String paginaSig = resources.getString("pagina_principal");
		ResultadoOperacionBean resultado = new ResultadoOperacionBean(ResultadoOperacionBean.EXITO,ResultadoOperacionBean.TITULO_EXITO,ResultadoOperacionBean.MSGEXITO);
		SessionContainer sessionContainer = (SessionContainer)session.getAttribute(ConstantsWeb.SESSION_CONTAINER);
		System.out.println("sessionContainer:"+sessionContainer);
		UsuarioBean usuarioLogeado = (UsuarioBean)sessionContainer.getSessionElement(ConstantsWeb.USUARIO);
		RegistroIngresoBean registroIngresoBean = (RegistroIngresoBean)sessionContainer.getSessionElement(ConstantsWeb.REGISTRO_INGRESO);
		List<OpcionBean> listMenu = null;
		String menuOpciones = null;
		RegistroIngresoBean filtroRegistro = null;
		
		try{
			String oficina = request.getParameter("txtOficina").toUpperCase();
			String terminal = request.getParameter("txtTerminal").toUpperCase();
			String fecha    = request.getParameter("txtFecha");
			
			//Se valida si ya existe un usuario de la misma oficia logeado con la
			//misma terminal
			filtroRegistro = new RegistroIngresoBean();
			filtroRegistro.setCodigooficina(oficina);
			filtroRegistro.setCodigoterminal(terminal);
			filtroRegistro.setFecharegistro(FormatoFecha.stringToDate(fecha));
			
			if(registroIngresoFacadeLocal.buscar(filtroRegistro).size() > 0 ){
				paginaSig = resources.getString("datos_ingreso_login");
				resultado.setResultado(ConstantsWeb.ERROR);
				resultado.setTitulo(resources.getString("titulo_error"));
				resultado.setMensaje(resources.getString("terminal_en_uso"));
			}else{
				//Se crea el registro de ingreso del usuario
				registroIngresoBean.setCodigooficina(oficina);
				registroIngresoBean.setCodigoterminal(terminal);
				registroIngresoBean.setCodigousuario(usuarioLogeado.getCodigousuario());
				registroIngresoBean.setFlagestado(new Long(1));
				registroIngresoBean.setFlagactivo(new Long(1));

				registroIngresoFacadeLocal.save(registroIngresoBean,usuarioLogeado);
				
				//Se arma las opciones de menu
				listMenu = perfilFacadeLocal.obtenerOpcionesMenuUsuario(usuarioLogeado.getCodigousuario());
				menuOpciones = this.armaMenuUsuario(listMenu);
				sessionContainer.addSessionElement(ConstantsWeb.MENU, menuOpciones);
			}
			
		} catch (RuntimeException e) {
			paginaSig = resources.getString("datos_ingreso_login");
			resultado.setResultado(ResultadoOperacionBean.ERROR);
			resultado.setTitulo(ResultadoOperacionBean.TITULO_ERROR);
			resultado.setMensaje(ResultadoOperacionBean.MSGERROR);
			//resultado.setTrace(StackTrace2String.stackTraceToString(e));
			e.printStackTrace();
		} catch (SQLException e) {
			resultado.setResultado(ResultadoOperacionBean.ERROR);
			resultado.setTitulo(ResultadoOperacionBean.TITULO_ERROR);
			resultado.setMensaje(ResultadoOperacionBean.MSGERROR);
			//resultado.setTrace(StackTrace2String.stackTraceToString(e));
			paginaSig = resources.getString("datos_ingreso_login");
			e.printStackTrace();
		}catch (Exception e) {
			resultado.setResultado(ResultadoOperacionBean.ERROR);
			resultado.setTitulo(ResultadoOperacionBean.TITULO_ERROR);
			resultado.setMensaje(ResultadoOperacionBean.MSGERROR);
			//resultado.setTrace(StackTrace2String.stackTraceToString(e));
			paginaSig = resources.getString("pagina_login");
			e.printStackTrace();
		}
		
		sessionContainer.addTemporal(ConstantsWeb.RESULTADO_OPERACION, resultado);
		
		return new ModelAndView(paginaSig,ConstantsWeb.RPTA_AJAX_REQUEXT,resultado.getAsArrayJS());
	}
	
	private String armaMenuUsuario(List<OpcionBean> menu){

		StringBuilder sbMenu = new StringBuilder();
		
		sbMenu.append(" var MENU_ITEMS = [\n");
		
		for(OpcionBean menu1 : menu){
			
			sbMenu.append(" [ '" + menu1.getTexto() + "',null,null,\n");
			
			for(OpcionBean menu2 : menu1.getOpciones()){
				sbMenu.append(" [ '" + menu2.getTexto() + "'," + CadenaUtil.apostrofe(menu2.getAccion())+",null,\n");
				
				for(OpcionBean menu3 : menu2.getOpciones()){
					sbMenu.append(" [ '" + menu3.getTexto() + "'," + CadenaUtil.apostrofe(menu3.getAccion())+",null,],\n");
				}
				sbMenu.append("],\n");
			}
			sbMenu.append("],\n");
		}
		
		sbMenu.append("];");
		
		return sbMenu.toString();
	}
}